import logging
import os
import logging
from datetime import datetime, timedelta

LOG_DIR = os.path.join(os.path.dirname(__file__), '../logs/')
os.makedirs(LOG_DIR, exist_ok=True)
# 确保info和error子目录存在
os.makedirs(os.path.join(LOG_DIR, 'info'), exist_ok=True)
os.makedirs(os.path.join(LOG_DIR, 'error'), exist_ok=True)

logger = logging.getLogger(__name__)


def clean_old_logs(log_dir=LOG_DIR, days_to_keep=2):
    """
    删除两天前的日志文件
    """
    cutoff_date = datetime.now() - timedelta(days=days_to_keep)
    for filename in os.listdir(log_dir):
        if not filename.startswith('test_') or not filename.endswith('.log'):
            continue
        try:
            date_str = filename[5:-4]  # 提取日期部分
            file_date = datetime.strptime(date_str, '%Y%m%d_%H%M%S')
            if file_date < cutoff_date:
                os.remove(os.path.join(log_dir, filename))
        except ValueError:
            continue


clean_old_logs()

for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    handlers=[
        logging.FileHandler(
            f"{LOG_DIR}/test_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log",
            encoding='utf-8'
        ),
        logging.StreamHandler()
    ]
)

# 创建两个FileHandler，分别写入不同文件
file_handler_info = logging.FileHandler(f'{LOG_DIR}/info/info.log', encoding='utf-8')
file_handler_error = logging.FileHandler(f'{LOG_DIR}/error/error.log', encoding='utf-8')
# 设置handler 的日志级别
file_handler_info.setLevel(logging.INFO)
file_handler_error.setLevel(logging.ERROR)
# 设置格式
formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
file_handler_info.setFormatter(formatter)
file_handler_error.setFormatter(formatter)
# 将 handler 添加到 logger
logger.addHandler(file_handler_info)
logger.addHandler(file_handler_error)
# 文件名即时间戳 → 无需读文件内容，也无需建数据库。
# 模块级主动清理 → 不用外部 crontab、不用 Celery、不用操作系统计划任务。
# 时间比较用 datetime，< 就删，逻辑简单粗暴且安全。
# 异常捕获 + 文件名过滤 → 人工改错文件名也不会把整个服务搞崩。
# 保留天数通过参数 days_to_keep 开放，改 7 天就传 7，随时可调。
